package com.xiaozhu.Utils;

import com.alibaba.fastjson.JSON;
import com.xiaozhu.pojo.ResultMessage;
import lombok.extern.slf4j.Slf4j;

/**
 * MessageUtils
 *
 * 消息工具类，用于封装消息对象并将其序列化为 JSON 字符串。
 * 主要功能：
 * 1️⃣ 方便服务端通过 WebSocket 向客户端发送消息。
 *    - 服务端封装消息对象（ResultMessage）并生成 JSON 字符串，
 *      然后通过 ChatEndpoint.java 发送给客户端。
 * 2️⃣ 支持发送不同类型的消息：
 *    - 系统消息（isSystemMessage = true）：例如用户上线/下线通知。
 *    - 普通聊天消息（isSystemMessage = false）：用户间的文本消息。
 * 3️⃣ 可扩展性强：消息内容可以是字符串、对象或自定义类型。
 *
 * 使用示例：
 * String json = MessageUtils.getMessage(true, null, onlineUsers);
 * wsSession.getBasicRemote().sendText(json);
 *
 * 作者：朱慧军
 * 版本：1.0
 */
@Slf4j
public class MessageUtils {

    /**
     * 封装消息对象并转换为 JSON 字符串
     *
     * @param isSystemMessage 是否为系统消息：
     *                        - true：系统消息（如上线、下线通知）
     *                        - false：普通聊天消息
     * @param fromName        消息发送者名称：
     *                        - 系统消息可为 null
     *                        - 普通消息为发送者用户名
     * @param message         消息内容：
     *                        - 可以是字符串、对象或其他任意类型
     * @return JSON 字符串：
     *         - 序列化成功返回 ResultMessage 对象对应的 JSON 字符串
     *         - 序列化失败返回 null
     */
    public static String getMessage(boolean isSystemMessage, String fromName, Object message) {
        try {
            // 创建一个 ResultMessage 对象，用于封装消息信息
            ResultMessage serviceMessage = new ResultMessage();

            // 设置消息类型：是否为系统消息
            serviceMessage.setSystem(isSystemMessage);

            // 设置消息内容
            serviceMessage.setMessage(message);

            // 设置消息发送者名称（可选）
            if (fromName != null) {
                serviceMessage.setFromName(fromName);
            }

            // 将封装好的对象序列化为 JSON 字符串并返回
            return JSON.toJSONString(serviceMessage);

        } catch (Exception e) {
            // 序列化失败时记录日志
            log.error("消息序列化异常", e);
        }

        // 序列化失败返回 null
        return null;
    }
}
